package org.alwayssuper.protocol.commons.transform.realtimev2025.enums;

/**
 * 定位状态枚举 (车辆位置数据 0x05)
 * 基于 GB/T 32960.3-2025 标准
 * 定位状态字节位定义：
 * Bit0: 0:有效定位 1:无效定位
 * Bit1: 0:北纬 1:南纬
 * Bit2: 0:东经 1:西经
 * Bit3-7: 保留
 * @author alwaysSuper
 */
public class LocationStatus {
    
    /**
     * 定位有效性枚举
     */
    public enum PositioningValidity {
        VALID_POSITIONING(0x00, "有效定位"),
        INVALID_POSITIONING(0x01, "无效定位");

        private final int code;
        private final String description;

        PositioningValidity(int code, String description) {
            this.code = code;
            this.description = description;
        }

        public int getCode() {
            return code;
        }

        public String getDescription() {
            return description;
        }
    }
    
    /**
     * 从定位状态字节解析定位有效性
     * @param statusByte 定位状态字节
     * @return 定位状态
     */
    public static PositioningValidity fromStatusByte(int statusByte) {
        return (statusByte & 0x01) == 0 ? PositioningValidity.VALID_POSITIONING : PositioningValidity.INVALID_POSITIONING;
    }

    /**
     * 检查是否为北纬
     * @param statusByte 定位状态字节
     * @return true:北纬 false:南纬
     */
    public static boolean isNorthLatitude(int statusByte) {
        return (statusByte & 0x02) == 0;
    }

    /**
     * 检查是否为东经
     * @param statusByte 定位状态字节
     * @return true:东经 false:西经
     */
    public static boolean isEastLongitude(int statusByte) {
        return (statusByte & 0x04) == 0;
    }

    /**
     * 获取纬度方向描述
     * @param statusByte 定位状态字节
     * @return "北纬"或"南纬"
     */
    public static String getLatitudeDirection(int statusByte) {
        return isNorthLatitude(statusByte) ? "北纬" : "南纬";
    }

    /**
     * 获取经度方向描述
     * @param statusByte 定位状态字节
     * @return "东经"或"西经"
     */
    public static String getLongitudeDirection(int statusByte) {
        return isEastLongitude(statusByte) ? "东经" : "西经";
    }

    /**
     * 检查定位是否有效
     * @param statusByte 定位状态字节
     * @return true=有效定位
     */
    public static boolean isValidLocation(int statusByte) {
        return (statusByte & 0x01) == 0;
    }
}